package br.com.fatecmc.persephone.endereco.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import br.com.fatecmc.core.dao.AbstractDAO;
import br.com.fatecmc.fatec.domain.Entidade;
import br.com.fatecmc.persephone.endereco.domain.Cidade;
import br.com.fatecmc.persephone.endereco.domain.Estado;

public class DAOEndereco extends AbstractDAO{

	@Override
	public void salvar(Entidade obj) throws IllegalArgumentException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Entidade alterar(Entidade obj) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean excluir(Entidade obj) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Collection consultar(Entidade obj) {

		if (obj instanceof Estado) {

			Estado estado = (Estado) obj;
			List<Estado> estados = new ArrayList<Estado>();

//			if(estado.getId() == null){
				
				String sql = "SELECT * FROM tba_estados";
				PreparedStatement pstm = null;
				ResultSet rs = null;

				try {
					pstm = conexao.getConexao().prepareStatement(sql);

					rs = pstm.executeQuery();

					while (rs.next()) {

						estado = new Estado();

						estado.setId(rs.getInt("id"));
						estado.setNome(rs.getString("nome"));
						estado.setSigla("sigla");
						estado.setPais("26"); // TODO Atributo definido como String
												// na classe e Integer no banco de
												// dados

						estados.add(estado);
					}

					pstm.close();
					return estados;

				} catch (SQLException e) {
					e.printStackTrace();
				}
//			} else {
//				List<Cidade> cidades = new ArrayList<Cidade>();
//				
//				String sql = "SELECT * FROM tba_cidades WHERE id_estado = ?";
//				PreparedStatement pstm = null;
//				ResultSet rs = null;
//				
//				try {
//					pstm = conexao.getConexao().prepareStatement(sql);
//					pstm.setInt(1, estado.getId());
//					rs = pstm.executeQuery();
//					
//					while(rs.next()){
//						Cidade cidade = new Cidade();
//						cidade.setId(rs.getInt("id"));
//						cidade.setNome(rs.getString("nome"));
//						cidades.add(cidade);
//					}
//					pstm.close();
//					return cidades;
//					
//				} catch (SQLException e) {
//					e.printStackTrace();
//				}
				
//				String sql = "SELECT * FROM tba_estados WHERE id = ?";
//				PreparedStatement pstm = null;
//				ResultSet rs = null;
//
//				try {
//					
//					pstm = conexao.getConexao().prepareStatement(sql);
//					
//					pstm.setInt(1, estado.getId());
//
//					rs = pstm.executeQuery();
//
//					while (rs.next()) {
//
//						estado = new Estado();
//
//						estado.setId(rs.getInt("id"));
//						estado.setNome(rs.getString("nome"));
//						estado.setSigla("sigla");
//						estado.setPais("26"); // TODO Atributo definido como String
//												// na classe e Integer no banco de
//												// dados
//
//						estados.add(estado);
//					}
//
//					pstm.close();
//					return estados;
//
//				} catch (SQLException e) {
//					e.printStackTrace();
//				}
//			}
			
		} else if (obj instanceof Cidade) {//Busca todas as cidades do estado

			Cidade cidade = (Cidade) obj;
			Estado estado = cidade.getEstado();

			if (cidade.getNome() == null && cidade.getId() == null) {
				
				
				List<Cidade> cidades = new ArrayList<Cidade>();

				String sql = "SELECT * FROM tba_cidades WHERE id_estado = ?";
				PreparedStatement pstm = null;
				ResultSet rs = null;

				try {

					pstm = conexao.getConexao().prepareStatement(sql);

					pstm.setInt(1, cidade.getEstado().getId());

					rs = pstm.executeQuery();

					while (rs.next()) {

						cidade = new Cidade();

						cidade.setId(rs.getInt("id"));
						cidade.setNome(rs.getString("nome"));
						cidade.setEstado(estado);

						cidades.add(cidade);
					}

					pstm.close();
					return cidades;

				} catch (SQLException e) {
					
					e.printStackTrace();

				}
			} else if (cidade.getNome() != null && cidade.getEstado() != null){//Busca a cidade com o nome e que esteja no estado
				
				List<Cidade> cidades = new ArrayList<Cidade>();
				String sql = "SELECT * FROM tba_cidades WHERE nome = ? AND id_estado = ?";
				
				PreparedStatement pstm = null;
				ResultSet rs = null;

				try {

					pstm = conexao.getConexao().prepareStatement(sql);
					
					pstm.setString(1, cidade.getNome());
					pstm.setInt(2, cidade.getEstado().getId());

					rs = pstm.executeQuery();

					rs.next();

					cidade = new Cidade();

					cidade.setId(rs.getInt("id"));
					cidade.setNome(rs.getString("nome"));
					cidade.setEstado(estado);

					cidades.add(cidade);

					pstm.close();
					
					return cidades;

				} catch (SQLException e) {
					
					e.printStackTrace();

				}
			} else {//Busca a cidade pelo id
				
				List<Cidade> cidades = new ArrayList<Cidade>();
				String sql = "SELECT * FROM tba_cidades WHERE id = ?";
				
				PreparedStatement pstm = null;
				ResultSet rs = null;

				try {

					pstm = conexao.getConexao().prepareStatement(sql);
					
					pstm.setInt(1, cidade.getId());

					rs = pstm.executeQuery();

					rs.next();

					cidade = new Cidade();

					cidade.setId(rs.getInt("id"));
					cidade.setNome(rs.getString("nome"));
					
					Estado est = new Estado();
					
					est.setId(rs.getInt("id_estado"));
					List<Entidade> estados = (List<Entidade>) this.consultar(est);
					
					
					cidade.setEstado((Estado) estados.get(0));

					cidades.add(cidade);

					pstm.close();
					
					return cidades;

				} catch (SQLException e) {
					
					e.printStackTrace();

				}
				
			}
		}
		return null;
	}
	
}
